package com.face.zf.model;

import cn.smartjavaai.common.config.Config;
import cn.smartjavaai.common.enums.DeviceEnum;
import cn.smartjavaai.face.config.FaceDetConfig;
import cn.smartjavaai.face.config.FaceRecConfig;
import cn.smartjavaai.face.constant.FaceDetectConstant;
import cn.smartjavaai.face.enums.FaceDetModelEnum;
import cn.smartjavaai.face.enums.FaceRecModelEnum;
import cn.smartjavaai.face.factory.FaceDetModelFactory;
import cn.smartjavaai.face.factory.FaceRecModelFactory;
import cn.smartjavaai.face.model.facedect.FaceDetModel;
import cn.smartjavaai.face.model.facerec.FaceRecModel;
import com.face.zf.util.PropertiesPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Properties;


/**
 * @Author: (ﾉ ◠ ‿ ◠)ﾉ wangYu
 * @CreateTime: 2025-07-10
 * @ContactMe WECHAT-> wy10012311   QQ-> 1569350611
 * @Description: 人脸离线模型构建类
 */
@Component
public class FaceModel {

    private static final Logger log = LoggerFactory.getLogger(FaceModel.class);

    protected static Properties application = PropertiesPool.obtainProperties();
    public static DeviceEnum device = DeviceEnum.CPU;


    /**
     * 获取人脸检测模型（使用双重检查锁定模式确保线程安全的单例）
     * @return
     */
    public static FaceDetModel getDetModel(){
        FaceDetConfig config = new FaceDetConfig();
        config.setModelEnum(FaceDetModelEnum.YOLOV5_FACE_320);
        String detModel = application.getProperty("face.detection.model.path");
        config.setModelPath(detModel);
        //只返回相似度大于该值的人脸,需要根据实际情况调整，分值越大越严格容易漏检，分值越小越宽松容易误识别
        config.setConfidenceThreshold(0.5f);
        //用于去除重复的人脸框，当两个框的重叠度超过该值时，只保留一个
        config.setNmsThresh(FaceDetectConstant.NMS_THRESHOLD);
        return FaceDetModelFactory.getInstance().getModel(config);
    }

    /**
     * 获取人脸识别模型,人脸对齐(可开启人脸对齐)（使用双重检查锁定模式确保线程安全的单例）
     * @return
     */
    public static FaceRecModel getFaceRecModel(){
        FaceRecConfig config = new FaceRecConfig();
        config.setModelEnum(FaceRecModelEnum.SEETA_FACE6_MODEL);
        String recModel = application.getProperty("face.recognition.model.path");
        config.setModelPath(recModel);
        config.setCropFace(false);
        config.setAlign(false);
        config.setDevice(device);
        config.setDetectModel(getDetModel());
        return FaceRecModelFactory.getInstance().getModel(config);
    }
}
